package fiuba.algo3.tp2;

//import java.util.Random;
import java.lang.Math;

public class Godzilla extends Catastrofe {

	 //Despertar  =>  1-Recto; 2-Diagonal; 3-ZigZag

	private int despertar;
	private Mapa mapa;

	public Godzilla(Coordenada puntoDeCreacion) {
		super(puntoDeCreacion, 0, 0);
		this.mapa = mapa.getInstance();
		setDespertarGodzilla();
	}

	public void setDespertarGodzilla() {
		this.despertar = crearNumeroRandomEntreMinYMaxInclusive(1,4);
		//this.despertar = ; //HARCKODEO PARA TEST
	}

	public int getDespertar() {
		return this.despertar;
	}

	public void iniciarCatastrofe() {
		recorrerParaAplicarCatastrofe();
	}

	private void recorrerParaAplicarCatastrofe() {
		//Coordenada coordenadaDespertarDeGodzila = this.puntoDeCreacion;
		recorrerMapaYaplicarDanioSegunDespertar(this.despertar);
		
	}

	private void recorrerMapaYaplicarDanioSegunDespertar(int despertar) {
		if (despertar == 1){
			recorrerYDaniarEdificiosConDespertar_1();
		}
		if (despertar == 2){
			recorrerYDaniarEdificiosConDespertar_2();
		}
		if (despertar == 3){
			recorrerYDaniarEdificiosConDespertar_3();
		}
	}

	private void recorrerYDaniarEdificiosConDespertar_1() {
		
		if (this.puntoDeCreacion.obtenerFila() == 0){
			for (int i=0; i<this.mapa.devolverTamanio(); i++){
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][this.puntoDeCreacion.obtenerColumna()];
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
			}
		}
		if (this.puntoDeCreacion.obtenerColumna() == 0){
			for (int j=0; j<this.mapa.devolverTamanio(); j++){
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[this.puntoDeCreacion.obtenerFila()][j];
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
			}
		}
		if (this.puntoDeCreacion.obtenerFila() == this.mapa.devolverTamanio()-1){
			for (int i=this.mapa.devolverTamanio()-1; i>=0; i--){
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][this.puntoDeCreacion.obtenerColumna()];
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
			}
		}
		if (this.puntoDeCreacion.obtenerColumna() == this.mapa.devolverTamanio()-1){
			for (int j=this.mapa.devolverTamanio()-1; j>=0; j--){
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[this.puntoDeCreacion.obtenerFila()][j];
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
			}
		}
	}

	private void recorrerYDaniarEdificiosConDespertar_2() {
		
		int izq = -1; int der = 1; //Para ver si va diagonalmente hacia izq o der
		int izqOder = elegirNumeroRandomDeEntreDosPosibles(izq, der);
		//System.out.println(this.puntoDeCreacion.devolverCoordenadaEnString());
		
		if (this.puntoDeCreacion.obtenerFila() == 0){
			
			int j=this.puntoDeCreacion.obtenerColumna();

			breakLoop:
			for (int i=this.puntoDeCreacion.obtenerFila(); i<this.mapa.devolverTamanio(); i++){
				//System.out.println("(" + i + ", " + j + ")");
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][j];
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
				j+=izqOder;
				if (j == this.mapa.devolverTamanio() | j == -1){
					break breakLoop;
				}
			}
		}
		if (this.puntoDeCreacion.obtenerColumna() == 0){
			
			int i=this.puntoDeCreacion.obtenerFila();

			breakLoop:
			for (int j=this.puntoDeCreacion.obtenerColumna(); j<this.mapa.devolverTamanio(); j++){
				//System.out.println("(" + i + ", " + j + ")");
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][j];
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
				i+=izqOder;
				if (i == this.mapa.devolverTamanio() | i == -1){
					break breakLoop;
				}
			}
		}
		if (this.puntoDeCreacion.obtenerFila() == this.mapa.devolverTamanio()-1){
			
			int j=this.puntoDeCreacion.obtenerColumna();

			breakLoop:
			for (int i=this.puntoDeCreacion.obtenerFila(); i<this.mapa.devolverTamanio(); i--){
				//System.out.println("(" + i + ", " + j + ")");
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][j];
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
				j+=izqOder;
				if (j == this.mapa.devolverTamanio() | j == -1){
					break breakLoop;
				}
			}
		}
		if (this.puntoDeCreacion.obtenerColumna() == this.mapa.devolverTamanio()-1){
			
			int i=this.puntoDeCreacion.obtenerFila();

			breakLoop:
			for (int j=this.puntoDeCreacion.obtenerColumna(); j<this.mapa.devolverTamanio(); j--){
				//System.out.println("(" + i + ", " + j + ")");
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][j];
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
				i+=izqOder;
				if (i == this.mapa.devolverTamanio() | i == -1){
					break breakLoop;
				}
			}
		}
	}

	private void recorrerYDaniarEdificiosConDespertar_3() {
		
		int izq = -1; int der = 1; //Para ver si empieza la diagonal hacia la izq o der
		int izqOder = elegirNumeroRandomDeEntreDosPosibles(izq, der);
		
		if (this.puntoDeCreacion.obtenerFila() == 0){
			//Para que no me quede en el borde (Godzilla se saldria del mapa al caminar)
			if (this.puntoDeCreacion.obtenerColumna() == 0){
				this.puntoDeCreacion.setColumna(this.puntoDeCreacion.obtenerColumna()+1);
			}
			if (this.puntoDeCreacion.obtenerColumna() == this.mapa.devolverTamanio()-1){
				this.puntoDeCreacion.setColumna(this.puntoDeCreacion.obtenerColumna()-1);
			}
			
			int j=this.puntoDeCreacion.obtenerColumna();

			for (int i=0; i<this.mapa.devolverTamanio(); i++){
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][j];
				//System.out.println("(" + i + ", " + j + ")");
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
				if (izqOder == -1){
					j = this.puntoDeCreacion.obtenerColumna() + (int)Math.pow((-1), i+1);
				} else {
					j = this.puntoDeCreacion.obtenerColumna() + (int)Math.pow((-1), i);
				}
			}
		}
		
		if (this.puntoDeCreacion.obtenerColumna() == 0){
			//Para que no me quede en el borde (Godzilla se saldria del mapa al caminar)
			if (this.puntoDeCreacion.obtenerFila() == 0){
				this.puntoDeCreacion.setFila(this.puntoDeCreacion.obtenerFila()+1);
			}
			if (this.puntoDeCreacion.obtenerFila() == this.mapa.devolverTamanio()-1){
				this.puntoDeCreacion.setFila(this.puntoDeCreacion.obtenerFila()-1);
			}
			
			int i=this.puntoDeCreacion.obtenerFila();

			for (int j=0; j<this.mapa.devolverTamanio(); j++){
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][j];
				System.out.println("(" + i + ", " + j + ")");
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
				if (izqOder == -1){
					i = this.puntoDeCreacion.obtenerFila() + (int)Math.pow((-1), j+1);
				} else {
					i = this.puntoDeCreacion.obtenerFila() + (int)Math.pow((-1), j);
				}
			}
		}
		
		if (this.puntoDeCreacion.obtenerFila() == this.mapa.devolverTamanio()-1){
			//Para que no me quede en el borde (Godzilla se saldria del mapa al caminar)
			if (this.puntoDeCreacion.obtenerColumna() == 0){
				this.puntoDeCreacion.setColumna(this.puntoDeCreacion.obtenerColumna()+1);
			}
			if (this.puntoDeCreacion.obtenerColumna() == this.mapa.devolverTamanio()-1){
				this.puntoDeCreacion.setColumna(this.puntoDeCreacion.obtenerColumna()-1);
			}
			
			int j=this.puntoDeCreacion.obtenerColumna();

			for (int i=this.mapa.devolverTamanio()-1; i>=0; i--){
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][j];
				//System.out.println("(" + i + ", " + j + ")");
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
				if (izqOder == -1){
					j = this.puntoDeCreacion.obtenerColumna() + (int)Math.pow((-1), i+1);
				} else {
					j = this.puntoDeCreacion.obtenerColumna() + (int)Math.pow((-1), i);
				}
			}
		}
		
		if (this.puntoDeCreacion.obtenerColumna() == this.mapa.devolverTamanio()-1){
			//Para que no me quede en el borde (Godzilla se saldria del mapa al caminar)
			if (this.puntoDeCreacion.obtenerFila() == 0){
				this.puntoDeCreacion.setFila(this.puntoDeCreacion.obtenerFila()+1);
			}
			if (this.puntoDeCreacion.obtenerFila() == this.mapa.devolverTamanio()-1){
				this.puntoDeCreacion.setFila(this.puntoDeCreacion.obtenerFila()-1);
			}
			
			int i=this.puntoDeCreacion.obtenerFila();

			for (int j=this.mapa.devolverTamanio()-1; j>=0; j--){
				Hectarea hectareaADaniar = this.mapa.getMapaCoordenado()[i][j];
				//System.out.println("(" + i + ", " + j + ")");
				if (hectareaADaniar.tieneUnEdificable()){ //ES EDIFICIO "DANIABLE"
					hectareaADaniar.aplicarDanioPorGodzilla();
				}
				if (izqOder == -1){
					i = this.puntoDeCreacion.obtenerFila() + (int)Math.pow((-1), j+1);
				} else {
					i = this.puntoDeCreacion.obtenerFila() + (int)Math.pow((-1), j);
				}
			}
		}
	}
	
}

